package com.example.threadLocalLearning;

public class TL1 {

    /**
     * `ThreadLocal` 允许为每个线程创建**独立的变量副本**，每个线程都拥有自己独立的值，互不干扰。
     * - **每个线程访问的变量都是独立的**。
     * - **即使多个线程访问同一个 `ThreadLocal` 变量，每个线程获取的值也是互不干扰的。**
     * - 主要解决的是**线程安全**问题，避免使用锁来实现数据隔离。
     */
    private static final ThreadLocal<Integer> threadLocal = new ThreadLocal<>();

    public static void main(String[] args) {

        /**
         * 每个线程（Thread 实例）内部都维护一个 ThreadLocalMap。
         * 这个 ThreadLocalMap 的作用是：存储这个线程对应的所有 ThreadLocal 实例以及它们各自的值。
         */
        Thread t1 = new Thread(() -> {
            threadLocal.set(1);
            System.out.println(Thread.currentThread().getName() + "=>" + threadLocal.get());
        });

        Thread t2 = new Thread(() -> {
            threadLocal.set(2);
            System.out.println(Thread.currentThread().getName() + "=>" + threadLocal.get());
        });

        /**
         * 1. `Thread-0` 和 `Thread-1` 访问的是同一个 `ThreadLocal` 变量。
         * 2. 由于 `ThreadLocal` 为每个线程保存独立的副本，因此两个线程互不干扰。
         */

        t1.start();
        t2.start();

    }
}
